{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
       "@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
       "@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
       "@import url('http://fonts.googleapis.com/css?family=Fira_sans');\n",
       "\n",
       "    div.cell{\n",
       "        width: 900px;\n",
       "        margin-left: 0% !important;\n",
       "        margin-right: auto;\n",
       "    }\n",
       "    div.text_cell code {\n",
       "        background: transparent;\n",
       "        color: #000000;\n",
       "        font-weight: 600;\n",
       "        font-size: 11pt;\n",
       "        font-style: bold;\n",
       "        font-family:  'Source Code Pro', Consolas, monocco, monospace;\n",
       "   }\n",
       "    h1 {\n",
       "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "\t}\n",
       "\t\n",
       "    div.input_area {\n",
       "        background: #F6F6F9;\n",
       "        border: 1px solid #586e75;\n",
       "    }\n",
       "\n",
       "    .text_cell_render h1 {\n",
       "        font-weight: 200;\n",
       "        font-size: 30pt;\n",
       "        line-height: 100%;\n",
       "        color:#c76c0c;\n",
       "        margin-bottom: 0.5em;\n",
       "        margin-top: 1em;\n",
       "        display: block;\n",
       "        white-space: wrap;\n",
       "        text-align: left;\n",
       "    } \n",
       "    h2 {\n",
       "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "        text-align: left;\n",
       "    }\n",
       "    .text_cell_render h2 {\n",
       "        font-weight: 200;\n",
       "        font-size: 16pt;\n",
       "        font-style: italic;\n",
       "        line-height: 100%;\n",
       "        color:#c76c0c;\n",
       "        margin-bottom: 0.5em;\n",
       "        margin-top: 1.5em;\n",
       "        display: block;\n",
       "        white-space: wrap;\n",
       "        text-align: left;\n",
       "    } \n",
       "    h3 {\n",
       "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "    }\n",
       "    .text_cell_render h3 {\n",
       "        font-weight: 200;\n",
       "        font-size: 14pt;\n",
       "        line-height: 100%;\n",
       "        color:#d77c0c;\n",
       "        margin-bottom: 0.5em;\n",
       "        margin-top: 2em;\n",
       "        display: block;\n",
       "        white-space: wrap;\n",
       "        text-align: left;\n",
       "    }\n",
       "    h4 {\n",
       "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "    }\n",
       "    .text_cell_render h4 {\n",
       "        font-weight: 100;\n",
       "        font-size: 14pt;\n",
       "        color:#d77c0c;\n",
       "        margin-bottom: 0.5em;\n",
       "        margin-top: 0.5em;\n",
       "        display: block;\n",
       "        white-space: nowrap;\n",
       "    }\n",
       "    h5 {\n",
       "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "    }\n",
       "    .text_cell_render h5 {\n",
       "        font-weight: 200;\n",
       "        font-style: normal;\n",
       "        color: #1d3b84;\n",
       "        font-size: 16pt;\n",
       "        margin-bottom: 0em;\n",
       "        margin-top: 0.5em;\n",
       "        display: block;\n",
       "        white-space: nowrap;\n",
       "    }\n",
       "    div.text_cell_render{\n",
       "        font-family: 'Fira sans', verdana,arial,sans-serif;\n",
       "        line-height: 125%;\n",
       "        font-size: 115%;\n",
       "        text-align:justify;\n",
       "        text-justify:inter-word;\n",
       "    }\n",
       "    div.output_subarea.output_text.output_pyout {\n",
       "        overflow-x: auto;\n",
       "        overflow-y: scroll;\n",
       "        max-height: 50000px;\n",
       "    }\n",
       "    div.output_subarea.output_stream.output_stdout.output_text {\n",
       "        overflow-x: auto;\n",
       "        overflow-y: scroll;\n",
       "        max-height: 50000px;\n",
       "    }\n",
       "    div.output_wrapper{\n",
       "        margin-top:0.2em;\n",
       "        margin-bottom:0.2em;\n",
       "}\n",
       "\n",
       "    code{\n",
       "      font-size: 70%;\n",
       "    }\n",
       "    .rendered_html code{\n",
       "    background-color: transparent;\n",
       "    }\n",
       "    ul{\n",
       "        margin: 2em;\n",
       "    }\n",
       "    ul li{\n",
       "        padding-left: 0.5em; \n",
       "        margin-bottom: 0.5em; \n",
       "        margin-top: 0.5em; \n",
       "    }\n",
       "    ul li li{\n",
       "        padding-left: 0.2em; \n",
       "        margin-bottom: 0.2em; \n",
       "        margin-top: 0.2em; \n",
       "    }\n",
       "    ol{\n",
       "        margin: 2em;\n",
       "    }\n",
       "    ol li{\n",
       "        padding-left: 0.5em; \n",
       "        margin-bottom: 0.5em; \n",
       "        margin-top: 0.5em; \n",
       "    }\n",
       "    ul li{\n",
       "        padding-left: 0.5em; \n",
       "        margin-bottom: 0.5em; \n",
       "        margin-top: 0.2em; \n",
       "    }\n",
       "    a:link{\n",
       "       font-weight: bold;\n",
       "       color:#447adb;\n",
       "    }\n",
       "    a:visited{\n",
       "       font-weight: bold;\n",
       "       color: #1d3b84;\n",
       "    }\n",
       "    a:hover{\n",
       "       font-weight: bold;\n",
       "       color: #1d3b84;\n",
       "    }\n",
       "    a:focus{\n",
       "       font-weight: bold;\n",
       "       color:#447adb;\n",
       "    }\n",
       "    a:active{\n",
       "       font-weight: bold;\n",
       "       color:#447adb;\n",
       "    }\n",
       "    .rendered_html :link {\n",
       "       text-decoration: underline; \n",
       "    }\n",
       "    .rendered_html :hover {\n",
       "       text-decoration: none; \n",
       "    }\n",
       "    .rendered_html :visited {\n",
       "      text-decoration: none;\n",
       "    }\n",
       "    .rendered_html :focus {\n",
       "      text-decoration: none;\n",
       "    }\n",
       "    .rendered_html :active {\n",
       "      text-decoration: none;\n",
       "    }\n",
       "    .warning{\n",
       "        color: rgb( 240, 20, 20 )\n",
       "    } \n",
       "    hr {\n",
       "      color: #f3f3f3;\n",
       "      background-color: #f3f3f3;\n",
       "      height: 1px;\n",
       "    }\n",
       "    blockquote{\n",
       "      display:block;\n",
       "      background: #fcfcfc;\n",
       "      border-left: 5px solid #c76c0c;\n",
       "      font-family: 'Open sans',verdana,arial,sans-serif;\n",
       "      width:680px;\n",
       "      padding: 10px 10px 10px 10px;\n",
       "      text-align:justify;\n",
       "      text-justify:inter-word;\n",
       "      }\n",
       "      blockquote p {\n",
       "        margin-bottom: 0;\n",
       "        line-height: 125%;\n",
       "        font-size: 100%;\n",
       "      }\n",
       "</style>\n",
       "<script>\n",
       "    MathJax.Hub.Config({\n",
       "                        TeX: {\n",
       "                           extensions: [\"AMSmath.js\"]\n",
       "                           },\n",
       "                tex2jax: {\n",
       "                    inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
       "                    displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
       "                },\n",
       "                displayAlign: 'center', // Change this to 'center' to center equations.\n",
       "                \"HTML-CSS\": {\n",
       "                    scale:100,\n",
       "                        availableFonts: [],\n",
       "                        preferredFont:null,\n",
       "                        webFont: \"TeX\",\n",
       "                    styles: {'.MathJax_Display': {\"margin\": 4}}\n",
       "                }\n",
       "        });\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# format the book\n",
    "%matplotlib inline\n",
    "import sys\n",
    "from __future__ import division, print_function\n",
    "import sys\n",
    "sys.path.insert(0,'../code')\n",
    "import book_format\n",
    "book_format.load_style('../code')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Odds and Addends\n",
    "\n",
    "## Odds\n",
    "\n",
    "One way to represent a probability is with a number between 0 and 1, but\n",
    "that’s not the only way. If you have ever bet on a football game or a\n",
    "horse race, you have probably encountered another representation of\n",
    "probability, called **odds**.\n",
    "\n",
    "You might have heard expressions like “the odds are three to one,” but\n",
    "you might not know what that means. The **odds in favor**\n",
    "of an event are the ratio of the probability it will occur to the\n",
    "probability that it will not.\n",
    "\n",
    "So if I think my team has a 75% chance of winning, I would say that the\n",
    "odds in their favor are three to one, because the chance of winning is\n",
    "three times the chance of losing.\n",
    "\n",
    "You can write odds in decimal form, but it is most common to write them\n",
    "as a ratio of integers. So “three to one” is written $3:1$.\n",
    "\n",
    "When probabilities are low, it is more common to report the **odds\n",
    "against** rather than the odds in favor. For example, if I think\n",
    "my horse has a 10% chance of winning, I would say that the odds against\n",
    "are $9:1$.\n",
    "\n",
    "Probabilities and odds are different representations of the same\n",
    "information. Given a probability, you can compute the odds like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.11111111111111112"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def Odds(p):\n",
    "    return p / (1-p)\n",
    "\n",
    "Odds(0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given the odds in favor, in decimal form, you can convert to probability\n",
    "like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.09999999999999999"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def Probability(o):\n",
    "    return o / (o+1)\n",
    "\n",
    "Probability(1/9.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you represent odds with a numerator and denominator, you can convert\n",
    "to probability like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def Probability2(yes, no):\n",
    "    return float(yes) / (yes + no)\n",
    "\n",
    "Probability2(1, 9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When I work with odds in my head, I find it helpful to picture people at\n",
    "the track. If 20% of them think my horse will win, then 80% of them\n",
    "don’t, so the odds in favor are $20:80$ or $1:4$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.2"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Probability2(20, 80)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If the odds are $5:1$ against my horse, then five out of six people\n",
    "think she will lose, so the probability of winning is $1/6$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.16666666666666663"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 - Probability2(5, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##The odds form of Bayes’s theorem\n",
    "\n",
    "In Chapter [intro] I wrote Bayes’s theorem in the <span>**probability\n",
    "form**</span>:\n",
    "\n",
    "$${{\\mathrm{p}(H|D)}} = \\frac{{{\\mathrm{p}(H)}}~{{\\mathrm{p}(D|H)}}}{{{\\mathrm{p}(D)}}}$$\n",
    "\n",
    "If we have two hypotheses, $A$ and $B$, we can write the ratio of\n",
    "posterior probabilities like this:\n",
    "\n",
    "$$\\frac{{{\\mathrm{p}(A|D)}}}{{{\\mathrm{p}(B|D)}}} = \\frac{{{\\mathrm{p}(A)}}~{{\\mathrm{p}(D|A)}}}\n",
    "{{{\\mathrm{p}(B)}}~{{\\mathrm{p}(D|B)}}}$$\n",
    "                                        \n",
    "Notice that the normalizing constant, <span>$\\mathrm{p}(D)$</span>,\n",
    "drops out of this equation.\n",
    "\n",
    "If $A$ and $B$ are mutually exclusive and collectively exhaustive, that\n",
    "means ${{\\mathrm{p}(B)}} = 1 - {{\\mathrm{p}(A)}}$,\n",
    "so we can rewrite the ratio of the priors, and the ratio of the\n",
    "posteriors, as odds.\n",
    "\n",
    "Writing <span>$\\mathrm{o}(A)$</span> for odds in favor of $A$, we get:\n",
    "\n",
    "$${{\\mathrm{o}(A|D)}} = {{\\mathrm{o}(A)}}~\\frac{{{\\mathrm{p}(D|A)}}}{{{\\mathrm{p}(D|B)}}}$$\n",
    "\n",
    "In words, this says that the posterior odds are the prior odds times the\n",
    "likelihood ratio. This is the <span>**odds form**</span> of Bayes’s\n",
    "theorem.\n",
    "\n",
    "This form is most convenient for computing a Bayesian update on paper or\n",
    "in your head. For example, let’s go back to the cookie problem:\n",
    "\n",
    "> Suppose there are two bowls of cookies. Bowl 1 contains 30 vanilla\n",
    "> cookies and 10 chocolate cookies. Bowl 2 contains 20 of each.\n",
    ">\n",
    "> Now suppose you choose one of the bowls at random and, without\n",
    "> looking, select a cookie at random. The cookie is vanilla. What is the\n",
    "> probability that it came from Bowl 1?\n",
    "\n",
    "The prior probability is 50%, so the prior odds are $1:1$, or just 1.\n",
    "The likelihood ratio is $\\frac{3}{4} / \\frac{1}{2}$, or $3/2$. So the\n",
    "posterior odds are $3:2$, which corresponds to probability $3/5$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Oliver’s blood\n",
    "\n",
    "Here is another problem from MacKay’s *Information Theory,\n",
    "Inference, and Learning Algorithms*:\n",
    "\n",
    "> Two people have left traces of their own blood at the scene of a\n",
    "> crime. A suspect, Oliver, is tested and found to have type ‘O’ blood.\n",
    "> The blood groups of the two traces are found to be of type ‘O’ (a\n",
    "> common type in the local population, having frequency 60%) and of type\n",
    "> ‘AB’ (a rare type, with frequency 1%). Do these data [the traces found\n",
    "> at the scene] give evidence in favor of the proposition that Oliver\n",
    "> was one of the people [who left blood at the scene]?\n",
    "\n",
    "To answer this question, we need to think about what it means for data\n",
    "to give evidence in favor of (or against) a hypothesis. Intuitively, we\n",
    "might say that data favor a hypothesis if the hypothesis is more likely\n",
    "in light of the data than it was before.\n",
    "\n",
    "In the cookie problem, the prior odds are $1:1$, or probability 50%. The\n",
    "posterior odds are $3:2$, or probability 60%. So we could say that the\n",
    "vanilla cookie is evidence in favor of Bowl 1.\n",
    "\n",
    "The odds form of Bayes’s theorem provides a way to make this intuition\n",
    "more precise. Again\n",
    "\n",
    "$${{\\mathrm{o}(A|D)}} = {{\\mathrm{o}(A)}}~\\frac{{{\\mathrm{p}(D|A)}}}{{{\\mathrm{p}(D|B)}}}$$\n",
    "\n",
    "Or dividing through by <span>$\\mathrm{o}(A)$</span>:\n",
    "\n",
    "$$\\frac{{{\\mathrm{o}(A|D)}}}{{{\\mathrm{o}(A)}}} = \\frac{{{\\mathrm{p}(D|A)}}}{{{\\mathrm{p}(D|B)}}}$$\n",
    "\n",
    "The term on the left is the ratio of the posterior and prior odds. The\n",
    "term on the right is the likelihood ratio, also called the <span>**Bayes\n",
    "factor**</span>.\n",
    "\n",
    "If the Bayes factor value is greater than 1, that means that the data\n",
    "were more likely under $A$ than under $B$. And since the odds ratio is\n",
    "also greater than 1, that means that the odds are greater, in light of\n",
    "the data, than they were before.\n",
    "\n",
    "If the Bayes factor is less than 1, that means the data were less likely\n",
    "under $A$ than under $B$, so the odds in favor of $A$ go down.\n",
    "\n",
    "Finally, if the Bayes factor is exactly 1, the data are equally likely\n",
    "under either hypothesis, so the odds do not change.\n",
    "\n",
    "Now we can get back to the Oliver’s blood problem. If Oliver is one of\n",
    "the people who left blood at the crime scene, then he accounts for the\n",
    "‘O’ sample, so the probability of the data is just the probability that\n",
    "a random member of the population has type ‘AB’ blood, which is 1%.\n",
    "\n",
    "If Oliver did not leave blood at the scene, then we have two samples to\n",
    "account for. If we choose two random people from the population, what is\n",
    "the chance of finding one with type ‘O’ and one with type ‘AB’? Well,\n",
    "there are two ways it might happen: the first person we choose might\n",
    "have type ‘O’ and the second ‘AB’, or the other way around. So the total\n",
    "probability is $2 (0.6) (0.01) = 1.2\\%$.\n",
    "\n",
    "The likelihood of the data is slightly higher if Oliver is\n",
    "<span>*not*</span> one of the people who left blood at the scene, so the\n",
    "blood data is actually evidence against Oliver’s guilt.\n",
    "\n",
    "This example is a little contrived, but it is an example of the\n",
    "counterintuitive result that data <span>*consistent*</span> with a\n",
    "hypothesis are not necessarily <span>*in favor of*</span> the\n",
    "hypothesis.\n",
    "\n",
    "If this result is so counterintuitive that it bothers you, this way of\n",
    "thinking might help: the data consist of a common event, type ‘O’ blood,\n",
    "and a rare event, type ‘AB’ blood. If Oliver accounts for the common\n",
    "event, that leaves the rare event still unexplained. If Oliver doesn’t\n",
    "account for the ‘O’ blood, then we have two chances to find someone in\n",
    "the population with ‘AB’ blood. And that factor of two makes the\n",
    "difference."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Addends\n",
    "\n",
    "The fundamental operation of Bayesian statistics is <span>Update</span>,\n",
    "which takes a prior distribution and a set of data, and produces a\n",
    "posterior distribution. But solving real problems usually involves a\n",
    "number of other operations, including scaling, addition and other\n",
    "arithmetic operations, max and min, and mixtures.\n",
    "\n",
    "This chapter presents addition and max; I will present other operations\n",
    "as we need them.\n",
    "\n",
    "The first example is based on <span>*Dungeons & Dragons*</span>, a\n",
    "role-playing game where the results of players’ decisions are usually\n",
    "determined by rolling dice. In fact, before game play starts, players\n",
    "generate each attribute of their characters—strength, intelligence,\n",
    "wisdom, dexterity, constitution, and charisma—by rolling three 6-sided\n",
    "dice and adding them up.\n",
    "\n",
    "So you might be curious to know the distribution of this sum. There are\n",
    "two ways you might compute it:\n",
    "\n",
    "Simulation:\n",
    ":   Given a Pmf that represents the distribution for a single die, you\n",
    "    can draw random samples, add them up, and accumulate the\n",
    "    distribution of simulated sums.\n",
    "\n",
    "Enumeration:\n",
    ":   Given two Pmfs, you can enumerate all possible pairs of values and\n",
    "    compute the distribution of the sums.\n",
    "\n",
    "`thinkbayes` provides functions for both. Here’s an example of the first\n",
    "approach. First, I’ll define a class to represent a single die as a Pmf:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import thinkbayes\n",
    "\n",
    "class Die(thinkbayes.Pmf):\n",
    "\n",
    "    def __init__(self, sides):\n",
    "        thinkbayes.Pmf.__init__(self)\n",
    "        for x in range(1, sides+1):\n",
    "            self.Set(x, 1)\n",
    "        self.Normalize()\n",
    "        \n",
    "    # for Python 3 compliance\n",
    "    def __hash__(self):\n",
    "        return id(self)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now I can create a 6-sided die:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "d6 = Die(6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And use `thinkbayes.SampleSum` to generate a sample of 1000 rolls."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dice = [d6] * 3\n",
    "three = thinkbayes.SampleSum(dice, 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`SampleSum` takes list of distributions (either Pmf or Cdf objects) and\n",
    "the sample size, <span>n</span>. It generates <span>n</span> random sums\n",
    "and returns their distribution as a Pmf object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def SampleSum(dists, n):\n",
    "    pmf = MakePmfFromList(RandomSum(dists) for i in xrange(n))\n",
    "    return pmf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SampleSum` uses `RandomSum`, also in `thinkbayes.py`:\n",
    "\n",
    "```python\n",
    "def RandomSum(dists):\n",
    "    total = sum(dist.Random() for dist in dists)\n",
    "    return total\n",
    "```\n",
    "\n",
    "`RandomSum` invokes `Random` on each distribution\n",
    "and adds up the results.\n",
    "\n",
    "The drawback of simulation is that the result is only approximately\n",
    "correct. As `n` gets larger, it gets more accurate, but of course the\n",
    "run time increases as well.\n",
    "\n",
    "The other approach is to enumerate all pairs of values and compute the\n",
    "sum and probability of each pair. This is implemented in `Pmf.__add__`:\n",
    "\n",
    "```python\n",
    "# class Pmf\n",
    "    def __add__(self, other):\n",
    "        pmf = Pmf()\n",
    "        for v1, p1 in self.Items():\n",
    "            for v2, p2 in other.Items():\n",
    "                pmf.Incr(v1+v2, p1*p2)\n",
    "        return pmf\n",
    "```\n",
    "\n",
    "`self` is a Pmf, of course; `other` can be a Pmf\n",
    "or anything else that provides `Items<`. The result is a new\n",
    "Pmf. The time to run `__add__` depends on the number of items in\n",
    "`self` and `other`; it is proportional to\n",
    "`len(self) \\* len(other)`.\n",
    "\n",
    "And here’s how it’s used:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "three_exact = d6 + d6 + d6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When you apply the `+` operator to a Pmf, Python invokes\n",
    "`__add__`. In this example, `__add__` is invoked twice.\n",
    "\n",
    "This shows an approximate result generated by\n",
    "simulation and the exact result computed by enumeration:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17fc8eea908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random\n",
    "import thinkplot\n",
    "\n",
    "random.seed(17)\n",
    "\n",
    "d6 = Die(6)\n",
    "\n",
    "dice = [d6] * 3\n",
    "three = thinkbayes.SampleSum(dice, 1000)\n",
    "three.name = 'sample'\n",
    "\n",
    "\n",
    "three_exact = d6 + d6 + d6\n",
    "three_exact.name = 'exact'\n",
    "\n",
    "thinkplot.PrePlot(num=2)\n",
    "thinkplot.Pmf(three)\n",
    "thinkplot.Pmf(three_exact, linestyle='dashed')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Pmf.__add__` is based on the assumption that the random selections from\n",
    "each Pmf are independent. In the example of rolling several dice, this\n",
    "assumption is pretty good. In other cases, we would have to extend this\n",
    "method to use conditional probabilities.\n",
    "\n",
    "The code from this section is available from\n",
    "<http://thinkbayes.com/dungeons.py>. For more information see\n",
    "Section [download]."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Maxima\n",
    "\n",
    "When you generate a *Dungeons & Dragons*\n",
    "character, you are\n",
    "particularly interested in the character’s best attributes, so you might\n",
    "like to know the distribution of the maximum attribute.\n",
    "\n",
    "There are three ways to compute the distribution of a maximum:\n",
    "\n",
    "**Simulation**:\n",
    "\n",
    "    Given a Pmf that represents the distribution for a single selection,\n",
    "    you can generate random samples, find the maximum, and accumulate\n",
    "    the distribution of simulated maxima.\n",
    "\n",
    "**Enumeration**:\n",
    "\n",
    "    Given two Pmfs, you can enumerate all possible pairs of values and\n",
    "    compute the distribution of the maximum.\n",
    "\n",
    "**Exponentiation**:\n",
    "\n",
    "    If we convert a Pmf to a Cdf, there is a simple and efficient\n",
    "    algorithm for finding the Cdf of the maximum.\n",
    "\n",
    "The code to simulate maxima is almost identical to the code for\n",
    "simulating sums:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def RandomMax(dists):\n",
    "    total = max(dist.Random() for dist in dists)\n",
    "    return total\n",
    "\n",
    "def SampleMax(dists, n):\n",
    "    pmf = MakePmfFromList(RandomMax(dists) for i in xrange(n))\n",
    "    return pmf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All I did was replace “sum” with “max”. And the code for enumeration is\n",
    "almost identical, too:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def PmfMax(pmf1, pmf2):\n",
    "    res = thinkbayes.Pmf()\n",
    "    for v1, p1 in pmf1.Items():\n",
    "        for v2, p2 in pmf2.Items():\n",
    "            res.Incr(max(v1, v2), p1*p2)\n",
    "    return res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In fact, you could generalize this function by taking the appropriate\n",
    "operator as a parameter.\n",
    "\n",
    "The only problem with this algorithm is that if each Pmf has $m$ values,\n",
    "the run time is proportional to $m^2$. And if we want the maximum of\n",
    "`k` selections, it takes time proportional to $k m^2$.\n",
    "\n",
    "If we convert the Pmfs to Cdfs, we can do the same calculation much\n",
    "faster! The key is to remember the definition of the cumulative\n",
    "distribution function: \n",
    "\n",
    "$$CDF(x) = {{\\mathrm{p}(X \\le~x)}}$$\n",
    "\n",
    "where $X$ is a random variable that means “a value chosen randomly from\n",
    "this distribution.” So, for example, $CDF(5)$ is the probability that a\n",
    "value from this distribution is less than or equal to 5.\n",
    "\n",
    "If I draw $X$ from $CDF_1$ and $Y$ from $CDF_2$, and compute the maximum\n",
    "$Z = max(X, Y)$, what is the chance that $Z$ is less than or equal to 5?\n",
    "Well, in that case both $X$ and $Y$ must be less than or equal to 5.\n",
    "\n",
    "If the selections of $X$ and $Y$ are independent,\n",
    "\n",
    "$$CDF_3(5) = CDF_1(5) CDF_2(5)$$ \n",
    "\n",
    "where $CDF_3$ is the distribution of\n",
    "$Z$. I chose the value 5 because I think it makes the formulas easy to\n",
    "read, but we can generalize for any value of $z$:\n",
    "\n",
    "$$CDF_3(z) = CDF_1(z) CDF_2(z)$$ \n",
    "\n",
    "In the special case where we draw $k$\n",
    "values from the same distribution,\n",
    "\n",
    "$$CDF_k(z) = CDF_1(z)^k$$ \n",
    "\n",
    "So to find\n",
    "the distribution of the maximum of $k$ values, we can enumerate the\n",
    "probabilities in the given Cdf and raise them to the $k$th power. `Cdf`\n",
    "provides a method that does just that:\n",
    "\n",
    "```python\n",
    "# class Cdf\n",
    "\n",
    "    def Max(self, k):\n",
    "        cdf = self.Copy()\n",
    "        cdf.ps = [p**k for p in cdf.ps]\n",
    "        return cdf\n",
    "```\n",
    "\n",
    "`Max` takes the number of selections, <span>k</span>, and returns a new\n",
    "Cdf that represents the distribution of the maximum of <span>k</span>\n",
    "selections. The run time for this method is proportional to $m$, the\n",
    "number of items in the Cdf.\n",
    "\n",
    "`Pmf.Max` does the same thing for Pmfs. It has to do a little more work\n",
    "to convert the Pmf to a Cdf, so the run time is proportional to\n",
    "$m \\log m$, but that’s still better than quadratic.\n",
    "\n",
    "Finally, here’s an example that computes the distribution of a\n",
    "character’s best attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3 9.84640042004852e-15\n",
      "4 4.0321009720098687e-11\n",
      "5 9.806069563928e-09\n",
      "6 6.203232264630567e-07\n",
      "7 1.7470129795277652e-05\n",
      "8 0.0002855723336481055\n",
      "9 0.002477241673570361\n",
      "10 0.012844085693359392\n",
      "11 0.04397964477539067\n",
      "12 0.10559054189425404\n",
      "13 0.18102225453979948\n",
      "14 0.21201352141686403\n",
      "15 0.19422452755628616\n",
      "16 0.14145216951432227\n",
      "17 0.0786340868804698\n",
      "18 0.027458253422613543\n"
     ]
    }
   ],
   "source": [
    "best_attr_cdf = three_exact.Max(6)\n",
    "best_attr_pmf = best_attr_cdf.MakePmf()\n",
    "best_attr_pmf.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Where `three_exact` is defined in the previous section. If we print the\n",
    "results, we see that the chance of generating a character with at least\n",
    "one attribute of 18 is about 3%. Figure [fig.dungeons2] shows the\n",
    "distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAusAAAEWCAYAAADfHdlnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVmX+//HXzQ0oKCqKrBqIipK4Ja64K6C5ZJm2WGlm\n6kw5aY2V38n5zUz5bfpmaZvaNm7ZZGWZmqio4YbmkloquOMKKKIoiiw39+8P6hS5QAqcG3g/Hw8f\ndl1c55z3uSL63IdzrmOx2+12RERERETE4TiZHUBERERERK5PxbqIiIiIiINSsS4iIiIi4qBUrIuI\niIiIOCgV6yIiIiIiDkrFuoiIiIiIg1KxLiIiIiLioIpdrM+YMYPg4GDc3NwIDw9n48aNNxy7bt06\nBg0ahL+/P9WqVaNly5bMnj37mjFOTk6F/litVg4cOHDrZyMiIiIiUoEUq1hfuHAh48eP56WXXmLX\nrl106tSJvn37cvLkyeuOj4+Pp0WLFixatIi9e/fypz/9idGjR/PZZ58VGmexWEhISCAlJYWUlBSS\nk5Np3Ljx7Z+ViIiIiEgFYCnOG0w7dOhAq1atmDVrltEXEhLCkCFDmDJlSrEO9MADD5Cfn88XX3wB\nFFxZ79mzJ2fPnqV27dq3GF9EREREpOIq8sp6bm4uO3bsIDIyslB/VFQU8fHxxT7QxYsX8fT0LNRn\nt9sJDw/H39+f3r17ExcXV+z9iYiIiIhUdEUW62lpadhsNnx8fAr1+/j4kJKSUqyDLFu2jLVr1zJm\nzBijz8/Pj1mzZrFo0SK+/vprmjRpQq9evdi0adMfPAURERERkYrJubQPsGnTJoYNG8Y777xDmzZt\njP6QkBBCQkKMdvv27UlKSuL1118nIiKi0D4yMjJKO6aIiIiISKmpWbPmLW1X5JV1Ly8vrFYrqamp\nhfpTU1Px9fW96bYbN27k7rvv5pVXXmH06NFFhmnfvj0HDx4scpyIiIiISGVQZLHu4uJCmzZtiI2N\nLdQfGxt7zRXw31q/fj133303//rXvxg3blyxwuzcuRM/P79ijRURERERqeiKdRvMs88+y2OPPUbb\ntm2JiIhg5syZJCcnM3bsWAAmTZrEtm3bWL16NQBxcXH079+fp556igcffNC4Km+1WvHy8gLgrbfe\nIigoiGbNmpGTk8P8+fNZsmQJX3311U2z3OqvEORa27dvByA8PNzkJBWP5rZ0aF5Lh+a1dGheS4fm\ntXRoXktHSdzKXaxifejQoaSnpzNlyhSSk5MJCwsjJiaGevXqAZCSksLRo0eN8XPnziUrK4upU6cy\ndepUoz8wMJAjR44AkJOTw/PPP8/Jkydxc3OjWbNmLF++nOjo6Ns+KRERERGRiqDYD5iOHTvWuJL+\ne79/O+ns2bOv6fu9iRMnMnHixOIeXkRERESk0inWG0xFRERERKTsqVgXEREREXFQKtZFRERERByU\ninUREREREQelYl1ERERExEGpWBcRERERcVAq1kVEREREHJSKdRERERERB6ViXURERETEQalYFxER\nERFxUCrWRUREREQclIp1EREREREHpWJdRERERMRBqVgXEREREXFQKtZFRERERByUinUREREREQel\nYl1ERERExEGpWBcRERERcVAq1kVEREREHJSKdRERERERB6ViXURERETEQalYFxERERFxUCrWRURE\nREQclIp1EREREREHpWJdRERERMRBqVgXEREREXFQKtZFRERERByUinUREREREQelYl1ERERExEGp\nWBcREZFyIzXjOMfOJZKde9XsKCJlwtnsACIiIiJFuXI1ky/jPmT7/nUAfH9kOeFNutIxLIr63sEm\npxMpPSrWRURExKElHtvFgtXvkJF5zui7mnOFjT+tYONPK6jv3ZBOYVHcFdIFtyruJiYVKXkq1kVE\nRMQhZedeZcnGeWz4cXmhfjeX6mTlZhrtE2cOs3DtTL5e/x/uCulMx7AognxDsFgsZR1ZpMSpWBcR\nERGHczR5P5+seouzF04bfdXcahAeGMUdtZtQy8+NzXti2XUonjxbLgA5edls2beGLfvW4FfnDjqF\nRdG2aXfcq1Y36zREbpuKdREREXEYebZcVm79nFXbFmG35xv9YQ3a8mCvpziQcAiAxvXCaFwvjMFX\nR7E9cR3xe1aRfO64MT753HEWrfuIJRvn0bJxRzqFRdHQ/05dbZdyR8W6iIiIOITkc8eZv3I6J88e\nMfqquLoxuOso2t/Z87qFdrWqHnRr1Z+uLfuRlHKAzXtW8cOBjeTkZQOQa8the+I6tieuw9szgI7N\nImkX2gMP95pldl4it0PFuoiIiJgqP99G3K6lLItfYNzSAtAooBnDov5CnRo+Re7DYrHQwK8JDfya\ncG/XJ/jhwAY27VnJyTO/Fv5nzp/im41zWBb/Cc0btqNTsyhC7miBk0UrWYvjKvZ354wZMwgODsbN\n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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17fc9b1e240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "xs = list(range(3,19))\n",
    "ps = best_attr_pmf.Probs(xs)\n",
    "plt.plot(xs, ps);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mixtures\n",
    "\n",
    "Let’s do one more example from *Dungeons & Dragons*.\n",
    "Suppose I have a box of dice with the following inventory:\n",
    "\n",
    "    5   4-sided dice\n",
    "    4   6-sided dice\n",
    "    3   8-sided dice\n",
    "    2  12-sided dice\n",
    "    1  20-sided die\n",
    "\n",
    "I choose a die from the box and roll it. What is the distribution of the\n",
    "outcome?\n",
    "\n",
    "If you know which die it is, the answer is easy. A die with\n",
    "<span>n</span> sides yields a uniform distribution from 1 to\n",
    "<span>n</span>, including both.\n",
    "\n",
    "But if we don’t know which die it is, the resulting distribution is a\n",
    "<span>**mixture**</span> of uniform distributions with different bounds.\n",
    "In general, this kind of mixture does not fit any simple mathematical\n",
    "model, but it is straightforward to compute the distribution in the form\n",
    "of a PMF.\n",
    "\n",
    "As always, one option is to simulate the scenario, generate a random\n",
    "sample, and compute the PMF of the sample. This approach is simple and\n",
    "it generates an approximate solution quickly. But if we want an exact\n",
    "solution, we need a different approach.\n",
    "\n",
    "Let’s start with a simple version of the problem where there are only\n",
    "two dice, one with 6 sides and one with 8. We can make a Pmf to\n",
    "represent each die:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "d6 = Die(6)\n",
    "d8 = Die(8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we create a Pmf to represent the mixture:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 0.14583333333333334\n",
      "2 0.14583333333333334\n",
      "3 0.14583333333333334\n",
      "4 0.14583333333333334\n",
      "5 0.14583333333333334\n",
      "6 0.14583333333333334\n",
      "7 0.06250000000000001\n",
      "8 0.06250000000000001\n"
     ]
    }
   ],
   "source": [
    "mix = thinkbayes.Pmf()\n",
    "for die in [d6, d8]:\n",
    "    for outcome, prob in die.Items():\n",
    "        mix.Incr(outcome, prob)\n",
    "mix.Normalize()\n",
    "mix.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first loop enumerates the dice; the second enumerates the outcomes\n",
    "and their probabilities. Inside the loop, `Pmf.Incr` adds up\n",
    "the contributions from the two distributions.\n",
    "\n",
    "This code assumes that the two dice are equally likely. More generally,\n",
    "we need to know the probability of each die so we can weight the\n",
    "outcomes accordingly.\n",
    "\n",
    "First we create a Pmf that maps from each die to the probability it is\n",
    "selected:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pmf_dice = thinkbayes.Pmf()\n",
    "pmf_dice.Set(Die(4), 5)\n",
    "pmf_dice.Set(Die(6), 4)\n",
    "pmf_dice.Set(Die(8), 3)\n",
    "pmf_dice.Set(Die(12), 2)\n",
    "pmf_dice.Set(Die(20), 1)\n",
    "pmf_dice.Normalize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we need a more general version of the mixture algorithm:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mix = thinkbayes.Pmf()\n",
    "for die, weight in pmf_dice.Items():\n",
    "    for outcome, prob in die.Items():\n",
    "        mix.Incr(outcome, weight*prob)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now each die has a weight associated with it (which makes it a weighted\n",
    "die, I suppose). When we add each outcome to the mixture, its\n",
    "probability is multiplied by <span>weight</span>."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17fc9b4fc18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "colors = thinkplot.Brewer.Colors()\n",
    "thinkplot.Hist(mix, width=0.9, color=colors[4])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This shows the result. As expected, values 1 through 4\n",
    "are the most likely because any die can produce them. Values above 12\n",
    "are unlikely because there is only one die in the box that can produce\n",
    "them (and it does so less than half the time).\n",
    "\n",
    "`thinkbayes`provides a function named\n",
    "`MakeMixture` that encapsulates this algorithm, so we could\n",
    "have written:\n",
    "\n",
    "```python```\n",
    "        mix = thinkbayes.MakeMixture(pmf_dice)\n",
    "```\n",
    "\n",
    "We’ll use <span>MakeMixture</span> again in Chapters [prediction] and\n",
    " [observer]."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Discussion\n",
    "\n",
    "Other than the odds form of Bayes’s theorem, this chapter is not\n",
    "specifically Bayesian. But Bayesian analysis is all about distributions,\n",
    "so it is important to understand the concept of a distribution well.\n",
    "From a computational point of view, a distribution is any data structure\n",
    "that represents a set of values (possible outcomes of a random process)\n",
    "and their probabilities.\n",
    "\n",
    "We have seen two representations of distributions: Pmfs and Cdfs. These\n",
    "representations are equivalent in the sense that they contain the same\n",
    "information, so you can convert from one to the other. The primary\n",
    "difference between them is performance: some operations are faster and\n",
    "easier with a Pmf; others are faster with a Cdf.\n",
    "\n",
    "The other goal of this chapter is to introduce operations that act on\n",
    "distributions, like `Pmf.__add__`, `Cdf.Max`, and\n",
    "`thinkbayes.MakeMixture`. We will use these operations later,\n",
    "but I introduce them now to encourage you to think of a distribution as\n",
    "a fundamental unit of computation, not just a container for values and\n",
    "probabilities."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
